Line Pretest 福岡前測驗(Top)
Posted on 5 21, 2016 in misc
Q1 Where n is a positive integer, the function $ f(n)$ satisfies the following.
(1) Please create a program to find $ f(n)$ .(You can write in any language that you are good at.)
Here can using recursive to sloving this problem:
def fib(i): if i<2: return 1 return fib(i-1)+fib(i-2)
But can reduce the time complexity by save the return value in list:
def fibonacci(n, fib=[0, 1]): if n >= len(fib): for i in range(len(fib), n+1): fib.append(fib[i-1]+fib[i-2]) return fib[n]
or using DP:
class dpFib(object): def __init__(self): self.__result = {0: 0, 1: 1} def fib(self, x): if x in self.__result: return self.__result[x] r = self.fib(x-1) + self.fib(x-2) self.__result[x] = r return r dpfib = dpFib() print(dpfib.fib(x=8181))
(2) Use the program from (1) to find $ f(8181)$.
fibonacci(n=8181)
Q2 Please implement a program that lists the nodes of a random binary tree by nodes at the same depth.
Using BFS, code:
def bfs(graph, queue, visited=None): if visited is None: visited = set() if not queue: return start = queue.pop(0) yield start visited.add(start) queue += [vertex for vertex in graph[start] - set(queue) - visited] yield from bfs(graph, queue, visited=visited) def bfs_paths(graph, queue, goal): if not queue: return (start, path) = queue.pop(0) if start == goal: yield path queue += [(vertex, path + [vertex]) for vertex in graph[start] - set(path)] yield from bfs_paths(graph, queue, goal) graph = { 'A': set(['B', 'C']), 'B': set(['A', 'D', 'E']), 'C': set(['A', 'F']), 'D': set(['B']), 'E': set(['B', 'F']), 'F': set(['C', 'E']), } print(repr([vertex for vertex in bfs(graph, ['A'])])) print(repr([path for path in bfs_paths(graph, [('A', ['A'])], 'F')]))
Output:
['A', 'C', 'B', 'F', 'D', 'E'] [['A', 'C', 'F'], ['A', 'B', 'E', 'F']]
Q3 (1) Imagine you are playing a board game. You roll a 6-faced dice and move forward the same number of spaces that you rolled. If the finishing point is “n” spaces away from the starting point, please implement a program that calculates how many possible ways are there to arrive exactly at the finishing point.
/* * Description: solve dice combinations using dynamic programing * Complier: g++ */ #include <iostream> #include <string> #include <cmath> #include <vector> using namespace std; /**************************************************************** * dice Combinations: using dynamic programming * * Basic idea: * dp[i][j] = sum(dp[i-1][j-k*coins[i-1]]) for k = 1,2,..., j/coins[i-1] * dp[0][j] = 1 for j = 0, 1, 2, ..., sum * * Output: * the number of combinations using dice construct sum * * Usage: * c[6] = {1, 2, 3, 4, 5, 6}; * int result = diceCombinations(c, 6, 100); * ****************************************************************/ int diceCombinations(int coins[], int diceKinds, int sum) { // 2-D array using vector: is equal to: dp[diceKinds+1][sum+1] = {0}; vector<vector<int> > dp(diceKinds + 1); for (int i = 0; i <= diceKinds; ++i) { dp[i].resize(sum + 1); } for (int i = 0; i <= diceKinds; ++i) { for (int j = 0; j <= sum; ++j) { dp[i][j] = 0; } } //init: dp[i][0] = 1; i = 0, 1, 2 ..., diceKinds //Notice: dp[0][0] must be 1 //using 0 kinds of dice construct 0 has one way. but it the foundation //of iteration. without it everything based on it goes wrong for (int i = 0; i <= diceKinds; ++i) { dp[i][0] = 1; } // iteration: dp[i][j] = sum(dp[i-1][j - k*coins[i-1]]) // k = 0, 1, 2, ... , j / coins[i-1] for (int i = 1; i <= diceKinds; ++i) { for (int j = 1; j <= sum; ++j) { dp[i][j] = 0; for (int k = 0; k <= j / coins[i-1]; ++k) { dp[i][j] += dp[i-1][j - k * coins[i-1]]; } } } return dp[diceKinds][sum]; } int main() { int coins[6] = {1, 2, 3, 4, 5, 6}; int sum = 610; int result = diceCombinations(coins, 6, 610); cout << "using 6 kinds of dice construct 610, combinations are: " << endl; cout << result << endl; return 0; }
def count(S, m, n): # We need n+1 rows as the table is consturcted in bottom up # manner using the base case 0 value case (n = 0) table = [[0 for x in range(m)] for x in range(n + 1)] # Fill the enteries for 0 value case (n = 0) for i in range(m): table[0][i] = 1 # Fill rest of the table enteries in bottom up manner for i in range(1, n + 1): for j in range(m): # Count of solutions including S[j] x = table[i - S[j]][j] if i - S[j] >= 0 else 0 # Count of solutions excluding S[j] y = table[i][j - 1] if j >= 1 else 0 # total count table[i][j] = x + y return table[n][m - 1]
(2) If n=610, how many possible ways are there to arrive exactly at the finishing point?
output =
Q4 Please tell us about the technologies you frequently use.
Category | Example | Your Experience |
---|---|---|
Languages | ||
Object Containers | ||
MVC | ||
ORM | ||
Testing | ||
IDE/Editor | ||
UML/Diagram | ||
SCM | ||
Builds | ||
CI/Quality | ||
Java Profilers | ||
Web Applications Performance Profilers |
||
Issue Trackers | ||
Agile Processes | ||
Social Coding Code Review |
Q5 Please answer the questions below.
Question | Answer |
---|---|
What specifically do you want to achieve at LINE Fukuoka? |
|
What kind of Web or smartphone applications are you interested in? |
|
List up to 3 kinds of technology you have gotten interested in recently, and why you are interested in them. |
|
1. What is the most technically difficult or interesting thing you have experienced in development or programming so far? 2. Why did you find it difficult / interesting? 3. What was your solution, and how did you implement it? (Please answer in as much detail as possible) |
|
Public repository URLs (e.g.: GitHub, Bitbucket, etc.) |
|
Public social accounts (if applicable; e.g.: Twitter, Facebook, etc.) |
|
Which 3 technical books or articles have made a big impact on you? |
Thank you for your time!